/**
 * PagRegistro.java
 * 
 * Projeto: SGA-LEDS
 * 
 * Rodrigo Soares Maia
 * IFES - Instituto Federal do Espírito Santo - Campus Serra
 */

package controleAtividades.cih;

import controleAtividades.cci.CtrlAtividades;
import controleInterno.cci.CtrlInterno;
import controleAtividades.cdp.Atividade;
import controleInterno.cdp.Colaborador;
import controleInterno.cdp.Projeto;
import controleAtividades.cdp.RegistroAtividade;
import controleInterno.cdp.TipoAtividade;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Slider;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

public class PagRegistro extends GenericForwardComposer
{
    private Window winRegistro;
    private Textbox descricao;
    private Textbox horaInicio;
    private Textbox horaFim;
    private Label duracao;
    private Slider progresso;
    private Label labelProgresso;
    private Datebox dia;
    
    private Calendar dataInicio;
    private Calendar dataFim;
    private double duracaoRegistro = 0.0;
    
    private int MODO;
    private Projeto p;
    private Colaborador c;
    private Atividade atividade;
    private RegistroAtividade obj;
    
    CtrlAtividades ctrl = CtrlAtividades.getInstance();

    public void doAfterCompose(Component comp) throws Exception
    {
        super.doAfterCompose(comp);
        
        ctrl.setPagRegistro(this);

        c = (Colaborador) Executions.getCurrent().getSession().getAttribute("colaborador");
        
        dia.setValue(Calendar.getInstance().getTime()); //TODO setar dia de hj
    }
    
    public void onCreate$winRegistro()
    {
        //verificando se existe algum usuario logado, se nao existir eh redirecionado para o login
        if (Executions.getCurrent().getSession().getAttribute("usuario") == null)
        {
            Executions.sendRedirect("/");
            winRegistro.detach();
        }
        else
        {
            MODO = (Integer) arg.get("tipo");

            if (MODO != CtrlInterno.SALVAR)
            {
                obj = (RegistroAtividade) arg.get("obj");
                
                atividade = (Atividade) obj.getColaborador().getAtividade();
                //this.preencherTela();

                if (MODO == CtrlInterno.CONSULTAR)
                {
                    //this.salvarAtividade.setVisible(false);
                    //this.bloquearTela();
                }
            }
            else
            {
                atividade = (Atividade) arg.get("atividade");    
            }

            winRegistro.setTitle("Criar Registro: " + atividade.getDescricao());
            
            descricao.setValue(atividade.getDescricao());
            
            progresso.setCurpos(atividade.getProgresso().intValue());
            labelProgresso.setValue(atividade.getProgresso().intValue() + "%");
        }
    }
    
    //TODO verificar constraints aqui no java...
    public void onBlur$horaInicio(Event event)
    {
        if (horaFim.getValue().length() >= 5 && horaInicio.getValue().length() >= 5)
        {
            duracaoRegistro = this.calculaDuracao();
            duracao.setValue(String.format("%.1f horas", duracaoRegistro));
        }
    }
    
    public void onBlur$horaFim(Event event)
    {
        if (horaInicio.getValue().length() >= 5 && horaFim.getValue().length() >= 5)
        {
            duracaoRegistro = this.calculaDuracao();
            duracao.setValue(String.format("%.1f horas", duracaoRegistro));
        }
    }
    
    public double calculaDuracao()
    {
        //TODO tem problema fazer esse calculo na interface?
        //TODO estah sendo considerado sempre o inicio e o fim do mesmo dia (o dia atual)

        dataInicio = Calendar.getInstance();
        dataFim = Calendar.getInstance();
        double diferenca;
        int tempoHoras;
        double diferencaHoras;

        String hi = horaInicio.getValue().substring(0, 2);
        String mi = horaInicio.getValue().substring(3, 5);

        String hf = horaFim.getValue().substring(0, 2);
        String mf = horaFim.getValue().substring(3, 5);

        dataInicio.set(java.util.Calendar.HOUR_OF_DAY, Integer.parseInt(hi));
        dataInicio.set(java.util.Calendar.MINUTE, Integer.parseInt(mi));
        
        System.out.println("Salvando...");
        System.out.println(dataInicio);

        dataFim.set(java.util.Calendar.HOUR_OF_DAY, Integer.parseInt(hf));
        dataFim.set(java.util.Calendar.MINUTE, Integer.parseInt(mf));
        
        System.out.println(dataFim);

        diferenca = dataFim.getTimeInMillis() - dataInicio.getTimeInMillis();

        tempoHoras = 1000 * 60 * 60;

        System.out.println(diferenca);

        System.out.println(tempoHoras);

        return diferencaHoras = diferenca/tempoHoras;
    }
    
    public void onClick$confirmar(Event event)
    {
        Map atributos = new HashMap();
        
        Calendar diaAtual = Calendar.getInstance();
        
        diaAtual.setTime(dia.getValue());
        
        if (MODO == CtrlInterno.EDITAR)
        {
            obj.setDia(diaAtual);
            obj.setHoraInicio(dataInicio);
            obj.setHoraFim(dataFim);
            obj.setDuracao(duracaoRegistro);
            
            //alterando o progresso da atividade
            //TODO alterar estado?? concluida, etc...
            atividade.setProgresso(Double.parseDouble((new Integer(progresso.getCurpos()).toString())));
            ctrl.alterarAtividade(atividade);
            
            if (ctrl.alterarRegistro(obj) != null)
            {
                winRegistro.onClose();
                //TODO mostrar mensagens de sucesso
            }
        }
        else
        {
            atributos.put("descricao", descricao.getValue());
            atributos.put("dia", diaAtual);
            atributos.put("horaInicio", dataInicio);
            atributos.put("horaFim", dataFim);
            atributos.put("duracao", duracaoRegistro);
            atributos.put("colaborador", c);
            atributos.put("atividade", atividade);
            
            //alterando o progresso da atividade
            //TODO alterar estado?? concluida, etc...
            atividade.setProgresso(Double.parseDouble((new Integer(progresso.getCurpos()).toString())));
            ctrl.alterarAtividade(atividade);
            
            if (ctrl.salvarRegistro(atributos) != null)
            {
                winRegistro.onClose();
                //TODO mostrar mensagens de sucesso
            }
        }
    }
    
    public void onClick$cancelar(Event event)
    {
        winRegistro.onClose();
    }
}
